package com.lengxf.pay.icbc.bean.base;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.lengxf.pay.common.bean.ParamSign;
import com.lengxf.pay.icbc.config.ICBC_PayConfig;
import lombok.Data;

import java.time.LocalDateTime;

@Data
public class BaseReq<T> implements ParamSign {

    //str	true	20	APP的编号,应用在API开放平台注册时生成
    @JsonProperty("app_id")
    private String appId;

    //str	true	40	消息通讯唯一编号，每次调用独立生成，APP级唯一
    @JsonProperty("msg_id")
    private String msgId;

    //请求参数格式，仅支持json
    private String format = "json";

    //字符集 ,缺省为UTF-8
    private String charset;

    //本接口此字段无需上送
    @JsonProperty("encrypt_type")
    private String encryptType;

    //str	false	5	签名类型
    @JsonProperty("sign_type")
    private String signType;

    //str	true	19	交易发生时间戳，yyyy-MM-dd HH:mm:ss格式
    @JsonProperty("timestamp")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime timestamp;

    //str	false	2048	本接口此字段无需上送
    private String ca;

    //str	true	-	请求参数的集合	-
    @JsonProperty("biz_content")
    private T bizContent;

    //str	true	300	报文签名
    private String sign;


    public BaseReq(ICBC_PayConfig config, T bizContent) {
        this.setMsgId(String.valueOf(System.currentTimeMillis()));
        this.setAppId(config.getAppId());
        this.setSignType(config.reqSignType().name());
        this.setTimestamp(LocalDateTime.now());
        this.setBizContent(bizContent);
    }

    @Override
    public ParamSign sign(String sign) {
        this.sign = sign;
        return this;
    }

}
